home *** CD-ROM | disk | FTP | other *** search
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include <netdb.h>
-
- void uzmislovo (int soq, char *slovo) {
-
- if (recv (soq, slovo, 1, 0)!=1) {
- perror("recv");
- exit(1);
- }
-
- }
-
- void pop_poruka (int soq, char *slovo) {
-
- do {
- uzmislovo (soq,slovo);
- putchar(*slovo);
- } while (!(*slovo=='\r'));
-
- uzmislovo (soq,slovo);
-
- if (!(*slovo=='\n')) {
- exit(1);
- }
-
- printf ("\n");
- }
-
-
- int check (int soq) {
-
- char *slovo = '\0';
- char buf[4];
-
- uzmislovo (soq, slovo);
-
- if (*slovo=='+') {
- if ((recv (soq, buf, 2, 0)==2) && (buf[0]=='O'&&buf[1]=='K')) {
- printf("+OK");
- /* stvar je ok - ispisujemo poruku i kraj f-je */
- pop_poruka (soq,slovo);
- return(0);
- }
- else {
- /* nekaj ne stima. vjerojatno nije POP server */
- printf("POP3 server not responding.\n");
- exit(1);
- }
- }
-
- else if (*slovo=='-') {
- if ((recv (soq, buf, 3, 0)==3) && ((buf[0]=='E') && (buf[1]=='R') && (buf[2]='R'))) {
- printf("+ERR");
- /* greska - ispisujemo poruku i kraj programa */
- pop_poruka (soq,slovo);
- exit(1);
- }
- else {
- /* nekaj ne stima. vjerojatno nije POP server */
- printf("POP3 server not responding.\n");
- exit(1);
- }
- }
-
- /* nekaj ne stima. vjerojatno nije POP server */
- printf("POP3 server not responding.\n");
- exit(1);
- }
-
- void main (int argc, char *argv[]) {
-
- int soq;
- int count;
- struct hostent *host;
- struct sockaddr_in sin = { 0 };
- FILE *fp;
- FILE *env;
- char buf[512];
- char hostname[512];
- char user_cmd[38] = "USER \0";
- char user[32];
- char pass_cmd[38] = "PASS \0";
- char pass[32];
-
- if (argc!=2) {
- printf ("Usage: weazel <message_file>\n");
- exit(1);
- }
-
- if (!(fp=fopen(argv[1],"rb"))) {
- printf ("Error opening file %s.\n",argv[1]);
- exit(1);
- }
-
- if (!(env=fopen("ENV:WEAZEL","rb"))) {
- printf ("Config file not found.\n");
- exit(1);
- }
-
- fgets(user,32,env);
- fgets(pass,32,env);
- fgets(hostname,512,env);
-
- /* sad maknemo CR i LF sa kraja houstnejma ako ih ima */
-
- if (hostname[strlen(hostname)-1]=='\r'||hostname[strlen(hostname)-1]=='\n') {
- hostname[strlen(hostname)-1]='\0';
- }
-
- if (hostname[strlen(hostname)-1]=='\r'||hostname[strlen(hostname)-1]=='\n') {
- hostname[strlen(hostname)-1]='\0';
- }
-
- fclose(env);
-
- soq = socket (AF_INET,SOCK_STREAM,0);
-
- if (soq < 0) {
- perror ("socket");
- exit (1);
- }
-
- if (!(host=gethostbyname(hostname))) {
- perror ("gethostbyname");
- exit (1);
- }
-
- memcpy (&sin.sin_addr, host->h_addr, sizeof(sin.sin_addr));
- sin.sin_family = host->h_addrtype;
- sin.sin_port = 110; /* POP3 port */
-
- if(connect(soq, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) < 0)
- {
- perror("connect");
- exit(1);
- }
-
- printf("Connected to %s.\n",hostname);
-
- check(soq);
-
- strcat(user_cmd,user);
-
- send(soq,user_cmd,strlen(user_cmd),0);
-
- check(soq);
-
- strcat(pass_cmd,pass);
-
- send (soq,pass_cmd,strlen(pass_cmd),0);
-
- check(soq);
-
- send (soq,"XTND XMIT\r\n",11,0);
-
- check(soq);
-
- do {
- count = fread(buf, 1, 512, fp);
- send (soq,buf,count,0);
- } while (!(feof(fp)));
-
- send (soq,"\r\n.\r\n",5,0);
-
- check(soq);
-
- send (soq,"QUIT\r\n",6,0);
-
- check(soq);
-
- CloseSocket(soq);
-
- }
-